Fric-frac MySQL DML CategoryEvent
Home

Fric-frac MySQL DML CategoryEvent

Fric-frac MySQL DML CategoryEvent

CRUD stored procedures voor de EventCategory tabel. De afspraak is dat de namen voor de stored procedurs beginnen met de naam van de tabel gevolgd door de naam van de CRUD handeling. De naam wordt in pascalnotatie geschreven.

Probleem

We moeten de gegevens van een event categorie kunnen inserten, updaten, deleten en selecteren. De selectie moet kunnen gebeuren op basis van de naam.

Design

Op basis van het Fric-frac Event Calendar logisch model maken we de stored procedures. Naast de standaard stored procedures, Insert, Update, Delete, SelectOne, SelectAll, maken we voor elke tabelkolom waarbij de Searchable is ingesteld op SELECTBY maken we een stored procedure waarbij er gezocht kan worden op deze kolom in de tabel.

Naam Beschrijving
EventCategoryInsert bevat 1 OUTPUT parameter om de nieuw Id te retourneren naar het calling programma od -100 als de naam van de categorie al bestaat
EventCategoryUpdate deze stored procedure updatet alle kolommen van de rij met de opgegeven Id
EventCategorySelectOne lees 1 rij in uit de tabel op basis van de Id, neem alle kolommen mee voor het detail venster
EventCategorySelectAll lees alle rijen in uit de tabel maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)
EventCategorySelectByName lees 1 rij in uit de tabel op basis van de Name maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)
EventCategoryLikeName haal alle rijen op uit de tabel waarvan de Name begint met de opgegeven tekenreeks, toon alleen de kolommen waarvan de List eigenschap op Yes staat
EventCategoryLikeXName haal alle rijen op uit de tabel waarvan de Name de opgegeven tekenreeks bevat, toon alleen de kolommen waarvan de List eigenschap op Yes staat

Oplossing

Vincent: Wij hebben dit gedaan met een reeks genummerde scripts die je snel na elkaar kan uitvoeren als er iets misloopt. Je vindt deze terug op Digitap, onder stored procedures EventTopic en EventCategory. Je wordt wel verwacht te kunnen toelichten wat deze scripts doen, dus lees ze aandachtig!

De Insert stored procedure

De Insert stored procedure is speciaal. We checken eerst als de naam al bestaat. Als die bestaat wordt een Id van -100 geretourneerd.

USE docent1;
DROP PROCEDURE IF EXISTS EventCategoryInsert;
DELIMITER //
CREATE PROCEDURE `EventCategoryInsert`
(     IN pName NVARCHAR (120) ,
    OUT pId INT
)
BEGIN
    IF NOT EXISTS (SELECT * from EventCategory WHERE `Name` = pName )
    THEN
        INSERT INTO `EventCategory`
        (
            `EventCategory`.`Name`
        )
        VALUES (
            pName
        );
        -- return the Id of the inserted row
        SELECT LAST_INSERT_ID() INTO pId;
    else
        set pId = -100; -- Name exitst already
    END IF;

END //
DELIMITER ;

De Insert stored procedure testen

De mogelijke waarden zijn:

Appearance or Signing
Attraction
Camp. Trip or Retreat
Concert or Performance
Conference
Convention
Course, Training or Workshop
Dinner or Gala
Festival or Fair
Game or Competition
Meeting or Networking Event
Other
Party or Social Gathering
Race or Endurance Event
Rally
Screening
Seminar or Talk
Tour
Tournament
Tradeshow, Consumer Show or Expo

We beginnen met één rij toe te voegen:

use docent1;
call EventCategoryInsert('Appearance or Signing', @newId);
select @newId;

De Id van de nieuwe rij wordt doorgegeven aan de @newId output parameter.

Test EventCategoryInsert
Test EventCategoryInsert

Als je de call nogmaals uitvoert wordt de waarde -100 geretourneerd!!!!

Je kan de andere categoriën ook toevoegen:

use docent1;
call EventCategoryInsert('Attraction Camp.', @newId);
call EventCategoryInsert('Trip or Retreat', @newId);
call EventCategoryInsert('Concert or Performance', @newId);
call EventCategoryInsert('Conference', @newId);
call EventCategoryInsert('Convention', @newId);
call EventCategoryInsert('Conference', @newId);
call EventCategoryInsert('Course, Training or Workshop', @newId);
call EventCategoryInsert('Dinner or Gala', @newId);
call EventCategoryInsert('Festival or Fair', @newId);
call EventCategoryInsert('Game or Competition', @newId);
call EventCategoryInsert('Meeting or Networking Event', @newId);
call EventCategoryInsert('Other', @newId);
call EventCategoryInsert('Party or Social Gathering', @newId);
call EventCategoryInsert('Race or Endurance Event', @newId);
call EventCategoryInsert('Rally', @newId);
call EventCategoryInsert('Screening', @newId);
call EventCategoryInsert('Seminar or Talk', @newId);
call EventCategoryInsert('Tour', @newId);
call EventCategoryInsert('Tournament', @newId);
call EventCategoryInsert('Tradeshow, Consumer Show or Expo', @newId);
Test EventCategoryInsert All
Test EventCategoryInsert All

We krijgen die foutmelding omdat we aan de kolom Name, de constraint UNIQUE hebben toegevoegd (zie Fric-frac MySQL Data Definition Language).

Na de dubbele rij stopt MySQL met de uitvoering van de script. Alle rijen na de dubbele zijn niet toegevoegd. We deleten tot en met de dubbele rij en proberen het opnieuw:

Test EventCategoryInsert Retry
Test EventCategoryInsert Retry

Let erop dat MySQL toch nieuwe Id's heeft gecreëerd bij de mislukte poging:

Test EventCategoryInsert Wrong Sequence
Test EventCategoryInsert Wrong Sequence

Als je toch een correcte nummering wilt, moet je eerste de rijen deleten die niet in de juiste volgorde staan, de teller resetten op de laatste rij in de juiste volgorde, en de gedelete rijen weer toevoegen:

use docent1;
delete from EventCategory where Id > 6;
-- reset de teller:
ALTER TABLE EventCategory AUTO_INCREMENT = 6;
-- en voeg de rijen opnieuw toe:
-- call EventCategoryInsert('Attraction Camp.', @newId);
-- call EventCategoryInsert('Trip or Retreat', @newId);
-- call EventCategoryInsert('Concert or Performance', @newId);
-- call EventCategoryInsert('Conference', @newId);
-- call EventCategoryInsert('Convention', @newId);
-- call EventCategoryInsert('Conference', @newId);
call EventCategoryInsert('Course, Training or Workshop', @newId);
call EventCategoryInsert('Dinner or Gala', @newId);
call EventCategoryInsert('Festival or Fair', @newId);
call EventCategoryInsert('Game or Competition', @newId);
call EventCategoryInsert('Meeting or Networking Event', @newId);
call EventCategoryInsert('Other', @newId);
call EventCategoryInsert('Party or Social Gathering', @newId);
call EventCategoryInsert('Race or Endurance Event', @newId);
call EventCategoryInsert('Rally', @newId);
call EventCategoryInsert('Screening', @newId);
call EventCategoryInsert('Seminar or Talk', @newId);
call EventCategoryInsert('Tour', @newId);
call EventCategoryInsert('Tournament', @newId);
call EventCategoryInsert('Tradeshow, Consumer Show or Expo', @newId);
select * from EventCategory order by Id;
Test EventCategoryInsert Right Sequence
Test EventCategoryInsert Right Sequence

De Update stored procedure

De Update stored procedure gelijkt op de Insert. Maar hier geef je de Id mee van de rij die je wilt updaten.

USE docent1;
DROP PROCEDURE IF EXISTS EventCategoryUpdate;
DELIMITER //
CREATE PROCEDURE `EventCategoryUpdate`
(
	pName NVARCHAR (120) ,
	pId INT 
)
BEGIN
UPDATE `EventCategory`
	SET
		`Name` = pName
	WHERE `EventCategory`.`Id` = pId;
END //
DELIMITER ;

De Update stored procedure testen:

use docent1;
-- we vervangen 'Conference' foor 'Oudeleerlingenavond'
call EventCategoryUpdate('Oudeleerlingenavond', 5);
select * from EventCategory order by Id;
Test EventCategoryUpdate
Test EventCategoryUpdate

En we zetten de oorspronkelijke waarde weer terug:

use docent1;
-- we vervangen 'Oudeleerlingenavond' foor 'Conference'
call EventCategoryUpdate('Conference', 5);
select * from EventCategory order by Id;

De Delete stored procedure

We maken eerste de stored procedure:

USE docent1;
DROP PROCEDURE IF EXISTS EventCategoryDelete;
DELIMITER //
CREATE PROCEDURE `EventCategoryDelete`
(
	 pId INT 
)
BEGIN
DELETE FROM `EventCategory`
	WHERE `EventCategory`.`Id` = pId;
END //
DELIMITER ;
Test EventCategoryDelete
Test EventCategoryDelete

De Delete stored procedure testen

use docent1;
-- we deleted de rij 'Conference'
call EventCategoryDelete(5);
select * from EventCategory order by Id;

We voegen categorie opnieuw toe:

use docent1;
-- we deleted de rij 'Conference'
call EventCategoryInsert('Conference', @newId);
select @newId;
Test EventCategoryDelete Insert Again
Test EventCategoryDelete Insert Again

De SelectOne stored procedure

De SelectOne stored procedure haalt één rij uit de tabel op op basis van de meegegeven Id.

USE docent1;
DROP PROCEDURE IF EXISTS EventCategorySelectOne;
DELIMITER //
CREATE PROCEDURE `EventCategorySelectOne`
(
	 pId INT 
)
BEGIN
SELECT `EventCategory`.`Name`,
	`EventCategory`.`Id`
 
FROM `EventCategory`
	WHERE `EventCategory`.`Id` = pId;
END //
DELIMITER ;

De SelectOne stored procedure testen

use docent1;
-- we selecteren de rij 'Conference' met Id=5
call EventCategorySelectOne(1);
Test EventCategorySelectOne
Test EventCategorySelectOne

De SelectAll stored procedure

We moeten in Fric-frac Event Calendar logisch model gaan kijken om te weten te komen welke kolommen getoond moeten worden. In de List kolom staat YES als de kolom in de SelectAll stored procedure moet worden opgenomen.

USE docent1;
DROP PROCEDURE IF EXISTS EventCategorySelectAll;
DELIMITER //
CREATE PROCEDURE `EventCategorySelectAll`
(
)
BEGIN
SELECT `EventCategory`.`Name`,
	`EventCategory`.`Id`
	FROM `EventCategory`
	ORDER BY `Name`;
END //
DELIMITER ;

De SelectAll stored procedure testen

use docent1;
-- we selecteren alle rijen
call EventCategorySelectAll();
Test EventCategorySelectAll
Test EventCategorySelectAll

De SelectByName stored procedure

We maken eerst de stored procedure:

USE docent1;
DROP PROCEDURE IF EXISTS EventCategorySelectByName;
DELIMITER //
CREATE PROCEDURE `EventCategorySelectByName`
(
	 pName NVARCHAR (120) 
)
BEGIN
SELECT `EventCategory`.`Name`,
	`EventCategory`.`Id`

	FROM `EventCategory`
	WHERE `EventCategory`.`Name` = pName
	ORDER BY `EventCategory`.`Name`;
END //
DELIMITER ;

De SelectByName stored procedure testen

use docent1;
-- we selecteren alle rijen
call EventCategorySelectByName('Conference');
Test EventCategorySelectByName
Test EventCategorySelectByName

De SelectLikeName stored procedure

Met de SelectLikeName procedure kan je alle categoriën ophalen die beginnen met een bepaalde tekenreeks. We gebruiken daarvoor de like operator en we plakken aan het einde van de zoektekenreeks een %:

USE docent1;
DROP PROCEDURE IF EXISTS EventCategorySelectLikeName;
DELIMITER //
CREATE PROCEDURE `EventCategorySelectLikeName`
(
	pName NVARCHAR (120) 
)
BEGIN
SELECT `EventCategory`.`Name`,
	`EventCategory`.`Id`
 
	FROM `EventCategory`
	WHERE `EventCategory`.`Name` like CONCAT(pName, '%')
	ORDER BY `EventCategory`.`Name`;
END //
DELIMITER ;

De SelectLikeName stored procedure testen

We willen alle categorieën die beginnen met 'con':

use docent1;
-- we selecteren alle rijen
call EventCategorySelectLikeName('Con');
Test EventCategorySelectLikeName
Test EventCategorySelectLikeName

De SelectLikeX stored procedure

We willen alle categoriën kunnen ophalen waarin een bepaalde tekenreeks voorkomt. We gebruiken daarvoor de like operator en we sluiten de zoektekenreeks in tussen twee %:

USE docent1;
DROP PROCEDURE IF EXISTS EventCategorySelectLikeXName;
DELIMITER //
CREATE PROCEDURE `EventCategorySelectLikeXName`
(
	pName NVARCHAR (120) 
)
BEGIN
	SELECT `EventCategory`.`Name`,
	`EventCategory`.`Id`

	FROM `EventCategory`
	WHERE `EventCategory`.`Name` like CONCAT('%', pName, '%')

	ORDER BY `EventCategory`.`Name` ;
END //
DELIMITER ;

De SelectLikeX stored procedure uittesten

We willen alle categorieën ophalen waarin de tekenreeks 'con' in voorkomt:

use docent1;
-- we selecteren alle rijen
call EventCategorySelectLikeXName('con');
Test EventCategorySelectLikeXName
Test EventCategorySelectLikeXName

JI
2017-09-15 16:39:30